
#pragma once
#include <iostream>
#include <vector>

//多维数组的传递在形参声明中需要注明各个维度的元素数目
/*
    { 1,  2,  3,  4,  5  }
    { 6,  7,  8,  9,  10 }
    { 11, 12, 31, 14, 15 }
    { 16, 17, 18, 19, 20 }
    { 21, 22, 23, 24, 25 }
    { 26, 27, 28, 29, 30 }
*/

/*
* Z 形遍历数组
* 1 2 6 11 7 3 4 8 12 16 21 17 31 9 5 10 14 18 22 26 27 23 19 15 20 24 28 29 25 30
*/
void ZTravel(const std::vector<std::vector<int>>& arr) {
    int row = arr.size(), col = arr[0].size();
    int i = 0, j = 0;

    //判断上坡还是下坡
    //左至右则上坡
    //右至左则下坡
    bool left2right = true;
    while (i < row && j < col) {
        if (left2right) {
            std::cout << arr[i][j] << " ";
            //是否 行 边界, 且没有达到 列 边界
            //列 ++, 下坡
            if (i == 0 && j < col - 1) {
                left2right = false;
                j++;
            }
            //达到 列 边界
            //行 ++, 下坡
            else if (j == col - 1) {
                left2right = false;
                i++;
            }
            //没达到 边界, 继续上坡
            else {
                i--;
                j++;
            }
        }

        else {
            std::cout << arr[i][j] << " ";
            //是否 列 边界, 且没有达到 行 边界
            //行 ++, 上坡
            if (j == 0 && i < row - 1) {
                left2right = true;
                i++;
            }
            //达到 行 边界
            //列 ++, 上坡
            else if (i == row - 1) {
                left2right = true;
                j++;
            }
            //没达到 边界, 继续下坡
            else {
                i++;
                j--;
            }
        }
    }
}